﻿/*
# -*- coding: utf-8 -*-
# 注意：

# 若希望将本代码用于商业用途，需先联系作者并获得明确授权。
# 作者不对因使用本代码引发的任何直接或间接损失负责。
# 如有违反上述条款的行为，作者保留追究法律责任的权利。

# 免责声明：
# 请尊重知识产权，遵循相关法律法规。

# Notice:
# If you wish to use this code for commercial purposes, you must contact the author and obtain explicit authorization.
# The author is not responsible for any direct or indirect losses caused by the use of this code.
# If any of the above terms are violated, the author reserves the right to pursue legal action.
# Disclaimer:
# Please respect intellectual property rights and comply with relevant laws and regulations.

# Внимание:
# Если вы хотите использовать этот код в коммерческих целях, вам необходимо связаться с автором и получить явное разрешение.
# Автор не несет ответственности за любые прямые или косвенные убытки, возникшие в результате использования этого кода.
# В случае нарушения вышеуказанных условий автор оставляет за собой право на юридическое преследование.
# Отказ от ответственности:
# Пожалуйста, уважайте интеллектуальную собственность и соблюдайте соответствующие законы и нормативные акты.

# Attention :
# Si vous souhaitez utiliser ce code à des fins commerciales, vous devez contacter l'auteur et obtenir une autorisation explicite.
# L'auteur n'est pas responsable des pertes directes ou indirectes causées par l'utilisation de ce code.
# En cas de violation des conditions ci-dessus, l'auteur se réserve le droit de poursuivre une action en justice.
# Avertissement :
# Veuillez respecter les droits de propriété intellectuelle et vous conformer aux lois et réglementations en vigueur.

# 注意：

# 若希望将本代码用于商业用途，需先联系作者并获得明确授权。
# 作者不对因使用本代码引发的任何直接或间接损失负责。
# 如有违反上述条款的行为，作者保留追究法律责任的权利。

# 免责声明：
# 请尊重知识产权，遵循相关法律法规。

# Notice:
# If you wish to use this code for commercial purposes, you must contact the author and obtain explicit authorization.
# The author is not responsible for any direct or indirect losses caused by the use of this code.
# If any of the above terms are violated, the author reserves the right to pursue legal action.
# Disclaimer:
# Please respect intellectual property rights and comply with relevant laws and regulations.

# Внимание:
# Если вы хотите использовать этот код в коммерческих целях, вам необходимо связаться с автором и получить явное разрешение.
# Автор не несет ответственности за любые прямые или косвенные убытки, возникшие в результате использования этого кода.
# В случае нарушения вышеуказанных условий автор оставляет за собой право на юридическое преследование.
# Отказ от ответственности:
# Пожалуйста, уважайте интеллектуальную собственность и соблюдайте соответствующие законы и нормативные акты.

# Attention :
# Si vous souhaitez utiliser ce code à des fins commerciales, vous devez contacter l'auteur et obtenir une autorisation explicite.
# L'auteur n'est pas responsable des pertes directes ou indirectes causées par l'utilisation de ce code.
# En cas de violation des conditions ci-dessus, l'auteur se réserve le droit de poursuivre une action en justice.
# Avertissement :
# Veuillez respecter les droits de propriété intellectuelle et vous conformer aux lois et réglementations en vigueur.

# 注意：

# 若希望将本代码用于商业用途，需先联系作者并获得明确授权。
# 作者不对因使用本代码引发的任何直接或间接损失负责。
# 如有违反上述条款的行为，作者保留追究法律责任的权利。

# 免责声明：
# 请尊重知识产权，遵循相关法律法规。

# Notice:
# If you wish to use this code for commercial purposes, you must contact the author and obtain explicit authorization.
# The author is not responsible for any direct or indirect losses caused by the use of this code.
# If any of the above terms are violated, the author reserves the right to pursue legal action.
# Disclaimer:
# Please respect intellectual property rights and comply with relevant laws and regulations.

# Внимание:
# Если вы хотите использовать этот код в коммерческих целях, вам необходимо связаться с автором и получить явное разрешение.
# Автор не несет ответственности за любые прямые или косвенные убытки, возникшие в результате использования этого кода.
# В случае нарушения вышеуказанных условий автор оставляет за собой право на юридическое преследование.
# Отказ от ответственности:
# Пожалуйста, уважайте интеллектуальную собственность и соблюдайте соответствующие законы и нормативные акты.

# Attention :
# Si vous souhaitez utiliser ce code à des fins commerciales, vous devez contacter l'auteur et obtenir une autorisation explicite.
# L'auteur n'est pas responsable des pertes directes ou indirectes causées par l'utilisation de ce code.
# En cas de violation des conditions ci-dessus, l'auteur se réserve le droit de poursuivre une action en justice.
# Avertissement :
# Veuillez respecter les droits de propriété intellectuelle et vous conformer aux lois et réglementations en vigueur.

# 注意：

# 若希望将本代码用于商业用途，需先联系作者并获得明确授权。
# 作者不对因使用本代码引发的任何直接或间接损失负责。
# 如有违反上述条款的行为，作者保留追究法律责任的权利。

# 免责声明：
# 请尊重知识产权，遵循相关法律法规。

# Notice:
# If you wish to use this code for commercial purposes, you must contact the author and obtain explicit authorization.
# The author is not responsible for any direct or indirect losses caused by the use of this code.
# If any of the above terms are violated, the author reserves the right to pursue legal action.
# Disclaimer:
# Please respect intellectual property rights and comply with relevant laws and regulations.

# Внимание:
# Если вы хотите использовать этот код в коммерческих целях, вам необходимо связаться с автором и получить явное разрешение.
# Автор не несет ответственности за любые прямые или косвенные убытки, возникшие в результате использования этого кода.
# В случае нарушения вышеуказанных условий автор оставляет за собой право на юридическое преследование.
# Отказ от ответственности:
# Пожалуйста, уважайте интеллектуальную собственность и соблюдайте соответствующие законы и нормативные акты.

# Attention :
# Si vous souhaitez utiliser ce code à des fins commerciales, vous devez contacter l'auteur et obtenir une autorisation explicite.
# L'auteur n'est pas responsable des pertes directes ou indirectes causées par l'utilisation de ce code.
# En cas de violation des conditions ci-dessus, l'auteur se réserve le droit de poursuivre une action en justice.
# Avertissement :
# Veuillez respecter les droits de propriété intellectuelle et vous conformer aux lois et réglementations en vigueur.

# 注意：

# 若希望将本代码用于商业用途，需先联系作者并获得明确授权。
# 作者不对因使用本代码引发的任何直接或间接损失负责。
# 如有违反上述条款的行为，作者保留追究法律责任的权利。

# 免责声明：
# 请尊重知识产权，遵循相关法律法规。

# Notice:
# If you wish to use this code for commercial purposes, you must contact the author and obtain explicit authorization.
# The author is not responsible for any direct or indirect losses caused by the use of this code.
# If any of the above terms are violated, the author reserves the right to pursue legal action.
# Disclaimer:
# Please respect intellectual property rights and comply with relevant laws and regulations.

# Внимание:
# Если вы хотите использовать этот код в коммерческих целях, вам необходимо связаться с автором и получить явное разрешение.
# Автор не несет ответственности за любые прямые или косвенные убытки, возникшие в результате использования этого кода.
# В случае нарушения вышеуказанных условий автор оставляет за собой право на юридическое преследование.
# Отказ от ответственности:
# Пожалуйста, уважайте интеллектуальную собственность и соблюдайте соответствующие законы и нормативные акты.

# Attention :
# Si vous souhaitez utiliser ce code à des fins commerciales, vous devez contacter l'auteur et obtenir une autorisation explicite.
# L'auteur n'est pas responsable des pertes directes ou indirectes causées par l'utilisation de ce code.
# En cas de violation des conditions ci-dessus, l'auteur se réserve le droit de poursuivre une action en justice.
# Avertissement :
# Veuillez respecter les droits de propriété intellectuelle et vous conformer aux lois et réglementations en vigueur.

 */
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameController : MonoBehaviour {
	public static GameController instance;
	[SerializeField] GameStage currGameStage;
	public static GameStage gameStage
	{
		get { return instance.currGameStage; }
		set
		{
			if (instance.currGameStage != value)
			{
				instance.currGameStage = value;
				if (OnGameStageChange != null) {
					OnGameStageChange(instance.currGameStage);
				}
			}
		}
	}
	public delegate void OnGameStageDelegate(GameStage stage);
	public static OnGameStageDelegate OnGameStageChange;

	private string videoAdid = "8ed9dg7e4eee2nmx1k";

	public static bool IsPlaying
	{
		get { return instance.currGameStage == GameStage.PLAY || instance.currGameStage == GameStage.ENLESS; }
	}
	public static bool IsGameComplete;
	[SerializeField]
	private Map map;
	public static Map Map
	{
		get { return instance.map; }
	}

	[SerializeField]
	private Player player;
	public static Player Player { get { return instance.player; } }


	private int gameScore { get { return PlayerPrefs.GetInt("score"); }
		set { PlayerPrefs.SetInt("score", PlayerPrefs.GetInt("score") + value); } }
	private int deadTime { get { return PlayerPrefs.GetInt("dead"); }
		set { PlayerPrefs.SetInt("dead", PlayerPrefs.GetInt("dead") + value); } }
	private int totalStar { get { return PlayerPrefs.GetInt("star"); }
		set { PlayerPrefs.SetInt("star", PlayerPrefs.GetInt("star") + value); } }
	public static int gameLevel { get { return PlayerPrefs.GetInt("level"); }
		set { PlayerPrefs.SetInt("level", PlayerPrefs.GetInt("level") + value); } }
	public static int currLevel;

	public MapHelper mapHelper;

	public static bool IsMenu = true;
	public static bool IsEnlessMode = false;
	private void Awake()
	{

		//		PlayerPrefs.DeleteAll ();
		instance = this;
		OnGameStageChange += OnGameStageChanged;
	}

	private void Start()
	{
		gameStage = GameStage.WAIT;
		DisplayScore();
	}
	GameStage lastStage;
	private void OnGameStageChanged(GameStage stage)
	{

		switch (stage) {
			case GameStage.WAIT:
				lastStage = stage;
				Wait();
				break;
			case GameStage.PLAY:
				Play();
				break;
			case GameStage.GAMEOVER:
				lastStage = stage;
				GameOver();
				break;
			case GameStage.ENLESS:
				lastStage = stage;
				Enless();
				break;
		}
	}
	private void Wait()
	{
		UIController.Wait(IsMenu);
		Player.Wait();
		if (Map != null)
			map.Recycle();
		MusicController.audioSource.clip = MusicController.menuClip;
		if (MusicController.music == 0)
			MusicController.audioSource.Play();
	}
	private void Play()
	{
		//AdsControl.Instance.HideBanner ();
		UIController.Play();
		if (map == null)
			map = mapHelper.SpawnMap(currLevel);
		Player.Play();
		MusicController.audioSource.clip = MusicController.gameClip;
		if (MusicController.music == 0)
			MusicController.audioSource.Play();
		if (currLevel == 0) {
			MusicController.PlayClip(1);
		} else {
			if (lastStage == GameStage.WAIT || lastStage == GameStage.ENLESS)
				MusicController.PlayClip(2);
			else
				MusicController.PlayClip(Random.Range(11, 14));
			if (Random.Range(0, 3) == 1) {
				MusicController.PlayClip(14);
			}
		}
	}
	private void GameOver()
	{
		if (!IsGameComplete)
		{
			UpdateGameScore(1, true);
			Player.Die();
			Player.Respawn(1);
		}
		else
		{
			if (gameLevel == currLevel)
				gameLevel = 1;
			UIController.SpawnLevel(false);
			UIController.GameOver();
			//AdsControl.Instance.showAds();
		}
	}
	private void DisplayScore()
	{
		for (int i = 0; i < 3; i++) {
			UpdateGameScore(i, false);
		}
	}
	public static void UpdateGameScore(int index, bool update)
	{
		if (update) {
			switch (index) {
				case 0://update score
					instance.gameScore = 1;
					UIController.SetText(index, instance.gameScore);
					break;
				case 1://update dead time
					instance.deadTime = 1;
					UIController.SetText(index, instance.deadTime);
					break;
				case 2://update star
					instance.totalStar = 1;
					UIController.SetText(index, instance.totalStar);
					break;
			}
		} else {
			switch (index) {
				case 0:
					UIController.SetText(index, instance.gameScore);
					break;
				case 1:
					UIController.SetText(index, instance.deadTime);
					break;
				case 2:
					UIController.SetText(index, instance.totalStar);
					break;
			}
		}
	}
	private void Enless()
	{
		Player.RespawnEnless();
		if (map != null) {
			Destroy(map.gameObject);
			currLevel++;
			map = mapHelper.SpawnMap(currLevel);
		}
		gameStage = GameStage.PLAY;
	}

	public void TouchWatchAds()
	{
		string videoAdid = VideData.Instance.GetVide();

        TTSDK.TTRewardedVideoAd r = AdMgr.Instance.ShowVideoAdNew(videoAdid);

		//创建激励视频关闭回调
		r.OnClose += (bol, val) =>
		{
			Debug.Log("关闭广告 ，是否已经看完" + bol);
			//看完广告获得提示
			if (bol)
			{
				instance.totalStar = 5;
				UpdateGameScore(2, false);
				MaidianNew.MaidianBackCallback(" ");
				Debug.Log("广告看完");
			}
			else
			{
				Debug.Log("广告未看完");
			}
		};

		//创建报错回调  
		r.OnError += (code, errorMessage) =>
		{

			Debug.Log("code:" + code + "错误信息：" + errorMessage);
		};

		//展示广告（新版本必须调用，不然无法展示出来广告）
		r.Show();

	}

	public void UpStart()
	{
        instance.totalStar = 10;
        UpdateGameScore(2, false);
    }
}
public enum GameStage
{
	INIT,
	WAIT,
	PLAY,
	GAMEOVER,
	ENLESS
}


